package main

import "fmt"

/**
	1、map的应用
	2、寻找一个字符串中含有最长不重复字串的长度
 */

/**
	查找 @param str 中字符串中出现最长不重复字串的长度
 */
func findNotRepeatSubStr(str string) int {

	/**
		保存的是字符串str中每个字符char最后出现的索引
	 */
	lastCharIndexMap := make(map[rune]int)

	// 最长字串开始的索引
	start := 0

	// 最长字串的长度
	maxLength := 0

	// 遍历字符串中的每个字符（char->go中是rune类型，即int32类型）
	for index, char := range []rune(str) {
		// 因为如果char
		lastIndex, charInMap := lastCharIndexMap[char]
		if charInMap && lastIndex >= start {
			start = lastCharIndexMap[char] + 1
		}
		if index-start+1 > maxLength {
			maxLength = index - start + 1
		}
		lastCharIndexMap[char] = index
	}

	return maxLength
}

func main() {

	fmt.Println(findNotRepeatSubStr("abcefdabcd"))
	fmt.Println(findNotRepeatSubStr("我要学习go语言,哈哈哈.我"))
	fmt.Println(findNotRepeatSubStr("I want to study."))
}
